/*
 * @Date: 2022-04-08 18:06:26
 * @LastEditors: zhaoxm
 * @LastEditTime: 2022-05-11 16:50:33
 * @Description: 操作树的工具方法
 */

/**
 * @description: 遍历 扁平数据结构 ， 或者树形结构
 * @param { Array | Object } data
 * @param { Function } cd
 */
export const findArrayItem = (data, cd) => {
  if (!data) return
  if (Array.isArray(data)) {
    for (const item of data) {
      cd && cd(item)
      findArrayItem(item, cd)
    }
  }
  if (data.children && data.children.length) {
    for (const item of data.children) {
      cd && cd(item)
      findArrayItem(item, cd)
    }
  }
}

// 数组或者树结构 转换成 map结构
export const arrayToMap = (data, key = "id") => {
  const map = {}
  findArrayItem(data, (item) => {
    map[item[key]] = item
  })
  return map
}

// 根据id查找树的节点
export const findTreeNodeById = (data, id, key = "ids") => {
  let node = null
  findArrayItem(data, (item) => {
    if (item[key] === id) {
      node = item
    }
  })
  return node
}

/**
 * @description: 给数增加层级标识
 * @param { Array } array 要标识的数组
 * @param { Number } level 标识从哪个层级开始
 * @return { Array } array 表示过的数组，这个是给原数组增加层级标识的
 */
export function arrayFlagLevel(array, level = 0, parent = null) {
  if (!array || !array.length) return
  for (const item of array) {
    item._parent = parent
    item.level = level
    if (item.children && item.children.length) {
      arrayFlagLevel(item.children, level + 1, item)
    }
  }
}
